/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.OneCommerceProject.controllers;

import com.OneCommerceProject.beans.FournisseurFacade;
import com.OneCommerceProject.beans.ItemFacade;
import com.OneCommerceProject.beans.ItemFourFacade;
import com.OneCommerceProject.beans.UtilisateurFacade;
import com.OneCommerceProject.controllers.util.JsfUtil;
import com.OneCommerceProject.entities.*;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.chart.*;

/**
 *
 * @author Malek
 */
@ManagedBean
@SessionScoped
public class menuController {

    private boolean edit;
    private List<Item> items = null;
    private Item item = new Item();
    private BigDecimal prix = null;
    private String itemId;
    private Item editedItem = null;
    private List<Fournisseur> listFournisseur = null;
    private List<Caracteristique> caracteristiques = null;
    private String categorie = "";
    private CartesianChartModel categoryModel;
    private CartesianChartModel priceChartModel;
    private BubbleChartModel nbreVenteModel = new BubbleChartModel();
    @EJB
    private com.OneCommerceProject.beans.ItemFacade ejbFacade;
    @EJB
    private com.OneCommerceProject.beans.PhotosFacade photosFacade;
    @EJB
    private com.OneCommerceProject.beans.PrixFacade prixFacade;
    @EJB
    private com.OneCommerceProject.beans.CaracteristiqueFacade caracteristiqueFacade;
    @EJB
    private com.OneCommerceProject.beans.UtilisateurFacade utilisateurFacade;
    @EJB
    private ItemFacade itemFacade;
    @EJB
    private ItemFourFacade itemFourFacade;
    @EJB
    private FournisseurFacade fournisseurFacade;

    public List<Item> getTopFiveItems() {
        List<Item> listItem = getItemFacade().findAllOrderByVente();
        List<Item> listTopFiveItems = null;
        if (listItem.size() > 5) {
            listTopFiveItems = new ArrayList<Item>();
            for (int i = 0; i < 5; i++) {
                listTopFiveItems.add(listItem.get(i));
            }
        }
        return listTopFiveItems;
    }

    public List<Item> getBottomFiveItems() {
        List<Item> listItem = getItemFacade().findAllOrderByVenteDesc();
        List<Item> listBottomFiveItems = new ArrayList<Item>();
        if (listItem.size() > 5) {
            for (int i = 0; i < 5; i++) {
                listBottomFiveItems.add(listItem.get(i));
            }
        }
        return listBottomFiveItems;
    }

    public Utilisateur getClientFidele() {
        List<Utilisateur> listUtil = getUtilisateurFacade().findClientFidele();
        if (listUtil.size()>0) {
            return listUtil.get(0);
        }else
            return null;
    }

    public BubbleChartModel getNbreVenteModel() {
        createNbreVenteModel();
        return nbreVenteModel;
    }

    private void createNbreVenteModel() {
        nbreVenteModel = new BubbleChartModel();
        if (categorie.isEmpty()) {
            int prix = 0;
            List<Prix> listPrix = new ArrayList<Prix>();
            List<Item> listItems = itemFacade.findByCategory(categorie);
            for (Item item : listItems) {
                listPrix = prixFacade.findByItem(item);
                Date date = new java.sql.Date(0);
                for (Prix varPrix : listPrix) {
                    if (varPrix.getDateprix().after(date)) {
                        date = varPrix.getDateprix();
                        prix = varPrix.getSomme().intValue();
                    }
                }
                nbreVenteModel.addBubble(new BubbleChartSeries(item.getNomitem(), prix, Integer.valueOf(item.getNbreVente().toString()), Integer.valueOf(item.getNbreVente().toString())));
            }
        }
    }

    public String goCategorie() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        categorie = externalContext.getRequestParameterMap().get("categorie");
        items = ejbFacade.findByCategory(categorie);
        return "/user/public.xhtml?faces-redirect=true";
    }

    public String getFournisseurLeader() {
        ItemFour itemFourLeader = getItemFourFacade().findItemLeader(item.getIditem());
        Fournisseur fournisseur = getFournisseurFacade().find(itemFourLeader.getFournisseur().getIdfour());
        return "Le fournisseur Leader est: " + fournisseur.getNomfour();
    }

    public CartesianChartModel getCategoryModel() {
        createCategoryModel();
        return categoryModel;
    }

    private void createCategoryModel() {
        categoryModel = new CartesianChartModel();
        LineChartSeries priceChartSeries = new LineChartSeries();
        priceChartSeries.setLabel("Prix de " + item.getNomitem());
        List<Prix> listPrix = prixFacade.findByItemOrdredByDate(item);
        for (Prix prix : listPrix) {
            priceChartSeries.set(prix.getDateprix().toString().substring(0, 11), prix.getSomme());
            categoryModel.addSeries(priceChartSeries);
        }
    }

    public CartesianChartModel getPriceChartModel() {
        createPriceCategoryModel();
        return priceChartModel;
    }

    public void setPriceChartModel(CartesianChartModel priceChartModel) {
        this.priceChartModel = priceChartModel;
    }
    
    private void createPriceCategoryModel() {
        priceChartModel = new CartesianChartModel();
        LineChartSeries priceChartSeries = new LineChartSeries();
        List<Prix> listPrix = prixFacade.findByItemOrdredByDate(item);
        for (Prix prix : listPrix) {
            priceChartSeries.set(prix.getDateprix().toString().substring(0, 11), prix.getNbrevente());
            priceChartModel.addSeries(priceChartSeries);
        }
    }

    public List<Fournisseur> getListFournisseur() {
        listFournisseur = new ArrayList<Fournisseur>();
        List<ItemFour> itemFourList = getItemFourFacade().findByItem(item.getIditem());
        for (int i = 0; i < itemFourList.size(); i++) {
            listFournisseur.add(itemFourList.get(i).getFournisseur());
        }
        return listFournisseur;
    }

    private ItemFourFacade getItemFourFacade() {
        return itemFourFacade;
    }

    public FournisseurFacade getFournisseurFacade() {
        return fournisseurFacade;
    }

    public UtilisateurFacade getUtilisateurFacade() {
        return utilisateurFacade;
    }

    public ItemFacade getItemFacade() {
        return itemFacade;
    }

    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

    public String goDetails() throws FileNotFoundException {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        itemId = externalContext.getRequestParameterMap().get("item");
        item = ejbFacade.find(new BigDecimal(itemId));
        caracteristiques = caracteristiqueFacade.findByItem(item);

        return "/user/details.xhtml?faces-redirect=true";
    }

    public Item getEditedItem() {
        if (editedItem != item) {
            editedItem = item;
        }
        return editedItem;
    }

    public void setEditedItem(Item editedItem) {
        this.editedItem = editedItem;
    }

    public Item getItem() {
        item = ejbFacade.find(new BigDecimal(itemId));
        return item;
    }

    public String getItemId() {
        return itemId;
    }

    public List<BigDecimal> getPhotosId() {
        List<Photos> listPhotos = photosFacade.findByIdItem(itemId);
        List<BigDecimal> photoIds = new ArrayList<BigDecimal>();
        for (Photos item : listPhotos) {
            photoIds.add(item.getIdphoto());
        }
        return photoIds;
    }

    public String getPrix() {
        List<Prix> listPrix = new ArrayList<Prix>();
        listPrix = prixFacade.findByItem(item);
        Date date = new java.sql.Date(0);
        for (Prix varPrix : listPrix) {
            if (varPrix.getDateprix().after(date)) {
                date = varPrix.getDateprix();
                prix = varPrix.getSomme();
            }
        }
        return prix.toString();
    }

    public String getPrix2(Item item) {
        List<Prix> listPrix = new ArrayList<Prix>();
        listPrix = prixFacade.findByItem(item);
        Date date = new java.sql.Date(0);
        for (Prix varPrix : listPrix) {
            if (varPrix.getDateprix().after(date)) {
                date = varPrix.getDateprix();
                prix = varPrix.getSomme();
            }
        }
        return prix.toString();
    }

    public List<Caracteristique> getCaracteristiques() {
        caracteristiques = caracteristiqueFacade.findByItem(item);
        return caracteristiques;
    }

    public String update() {
        if (!edit) {
            edit = true;
        } else {
            JsfUtil.addSuccessMessage("Edition a été faite avec succes !!");
            ejbFacade.edit(item);
            edit = false;
        }
        return null;
    }

    public void confirmChanges() {
        try {
            ejbFacade.edit(editedItem);
            item = editedItem;
            JsfUtil.addSuccessMessage(editedItem.getNomitem() + " edited successfully !");
        } catch (Exception e) {
        }
    }
}
